home *** CD-ROM | disk | FTP | other *** search
/ AP Professional Graphics CD-ROM Library / AP Professional Graphics CD-ROM Library.iso / pc / unix / appendix / gemsii / hilbert.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-17  |  3.1 KB  |  119 lines

  1.  
  2. #include <gl/gl.h>     /* SGI Graphics Library assumed */
  3.  
  4. #define STEP_SIZE 4    /* # of pixels in each step */
  5.  
  6. long coord[2];         /* X,Y for graphics calls */
  7.  
  8. void step(long angle)
  9. {
  10.    while (angle > 270) angle -= 360;    /* Fold ANGLE to be 0, 90, 180, 270 */
  11.    while (angle <   0) angle += 360;
  12.    if      (angle == 0)   coord[0] += STEP_SIZE;  /* +X */
  13.    else if (angle == 90)  coord[1] += STEP_SIZE;  /* +Y */
  14.    else if (angle == 180) coord[0] -= STEP_SIZE;  /* -X */
  15.    else if (angle == 270) coord[1] -= STEP_SIZE;  /* -Y */
  16.    v2i(coord);                          /* Draw (poly)line to new X,Y = coord */
  17. }
  18.  
  19. /* Recursive Hilbert-curve generation algorithm                    */
  20. /* ORIENT is either +1 or -1...it swaps left turns and right turns */
  21. /* ANGLE is some multiple of 90 degrees...positive or negative     */
  22. /* LEVEL is the recursion level                                    */
  23. /* 2^LEVEL by 2^LEVEL points will be visited in total              */
  24.  
  25. void hilbert (orient,angle,level)
  26. long orient,*angle,level;
  27. {
  28.    if (level-- <= 0) return;
  29.    *angle += orient * 90;
  30.    hilbert(-orient,angle,level);
  31.    step(*angle);
  32.    *angle -= orient * 90;
  33.    hilbert(orient,angle,level);
  34.    step(*angle);
  35.    hilbert(orient,angle,level);
  36.    *angle -= orient * 90;
  37.    step(*angle);
  38.    hilbert(-orient,angle,level);
  39.    *angle += orient * 90;
  40. }
  41.  
  42. /* Recursive Peano-curve generation  */
  43. /* Same parameters as Hilbert above  */
  44. /* 3^LEVEL by 3^LEVEL points visited */
  45.  
  46. void peano (orient,angle,level)
  47. long orient,*angle,level;
  48. {
  49.    if (level-- <= 0) return;
  50.    peano(orient,angle,level);
  51.    step(*angle);
  52.    peano(-orient,angle,level);
  53.    step(*angle);
  54.    peano(orient,angle,level);
  55.    *angle -= orient * 90;
  56.    step(*angle);
  57.    *angle -= orient * 90;
  58.    peano(-orient,angle,level);
  59.    step(*angle);
  60.    peano(orient,angle,level);
  61.    step(*angle);
  62.    peano(-orient,angle,level);
  63.    *angle += orient * 90;
  64.    step(*angle);
  65.    *angle += orient * 90;
  66.    peano(orient,angle,level);
  67.    step(*angle);
  68.    peano(-orient,angle,level);
  69.    step(*angle);
  70.    peano(orient,angle,level);
  71. }
  72.  
  73.  
  74. void main()
  75. {
  76. long initial_angle;
  77.  
  78. /* Set up window on screen for 24-bit drawing */
  79. /* This presumes SGI graphics library         */
  80.    prefposition(192,1088,236,788);  
  81.    foreground();
  82.    winopen("Hilbert and Peano curves");
  83.    RGBmode();
  84.    gconfig();
  85.    cpack(0x00701030);  /* Background = indigo */ 
  86.    clear();
  87.    cpack(0x00FFFFFF);  /* Curve = white */
  88.  
  89. /* Start polyline near bottom left corner */
  90.    bgnline();
  91.    coord[0] = 20;
  92.    coord[1] = 20;
  93.    v2i(coord);
  94.  
  95. /* Visit 128x128 points along Hilbert curve using STEP_SIZE steps, */
  96. /* so pattern will fill 512x512 area on screen since STEP_SIZE = 4 */
  97.    initial_angle = 0;
  98.    hilbert(1,&initial_angle,7);
  99.  
  100. /* Start polyline to right of other curve */
  101.    bgnline();
  102.    coord[0] = 552;
  103.    coord[1] = 20;
  104.    v2i(coord);
  105.  
  106. /* Visit 81x81 points along Peano curve using STEP_SIZE steps,     */
  107. /* so pattern will fill 324x324 area on screen since STEP_SIZE = 4 */
  108.    initial_angle = 0;
  109.    peano(-1,&initial_angle,4);
  110.  
  111. /* All done...admire it for 10 seconds */
  112.    endline();
  113.    sleep(10);
  114. }
  115.  
  116.  
  117.  
  118.  
  119.